﻿//
// Copyright © MixModes Inc. 2011
//

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;

namespace MixModes.Phone.Synergy.Converters
{
    /// <summary>
    /// Pipe converter - Pipes a value through a range of converters to obtain the end value
    /// </summary>
    [ContentProperty("Converters")]
    public class PipeConverter : IValueConverter
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="PipeConverter"/> class.
        /// </summary>
        public PipeConverter()
        {
            Converters = new List<IValueConverter>();
        }

        /// <summary>
        /// Gets or sets the converters.
        /// </summary>
        /// <value>The converters.</value>
        public List<IValueConverter> Converters 
        { 
            get; 
            private set; 
        }

        /// <summary>
        /// Modifies the source data before passing it to the target for display in the UI.
        /// </summary>
        /// <param name="value">The source data being passed to the target.</param>
        /// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the target dependency property.
        /// </returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Converters.ForEach(converter => { value = converter.Convert(value, targetType, parameter, culture); });
            return value;
        }

        /// <summary>
        /// Modifies the target data before passing it to the source object.  This method is called only in <see cref="F:System.Windows.Data.BindingMode.TwoWay"/> bindings.
        /// </summary>
        /// <param name="value">The target data being passed to the source.</param>
        /// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the source object.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the source object.
        /// </returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
